package com.example.springbootdemo.controller;

import com.example.springbootdemo.bean.response.ResponseInfo;
import com.example.springbootdemo.scheduler.QuartzJobScheduler;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 动态定时任务api接口
 * @author hh
 * @date 2022/1/25
 */
@Slf4j
@Api(tags = "动态定时任务api接口")
@RestController
@RequestMapping("quartz")
public class QuartzApiController {

    @Autowired
    private QuartzJobScheduler quartzJobScheduler;

    /**
     * 启动所有定时任务
     * @return String
     */
    @ApiOperation("开启所有定时任务")
    @PostMapping("start")
    public ResponseInfo startJob(){
        try {
            quartzJobScheduler.startAllJob();
            return ResponseInfo.success();
        } catch (SchedulerException e) {
            e.printStackTrace();
            log.error("启动所有定时任务失败", e);
            return ResponseInfo.fail(e.getMessage());
        }
    }

    /**
     * 获取定时任务信息
     * @param name name
     * @param group group
     * @return ResponseInfo
     */
    @ApiOperation("获取任务信息")
    @GetMapping("getJobInfo")
    public ResponseInfo getJobInfo(String name, String group){
        try {
            String jobInfo = quartzJobScheduler.getJobInfo(name, group);
            return ResponseInfo.success(jobInfo);
        } catch (SchedulerException e) {
            e.printStackTrace();
            log.error("获取任务信息失败", e);
            return ResponseInfo.fail(e.getMessage());
        }
    }

    /**
     * 修改定时任务时间
     * @param name 名字
     * @param group 组
     * @param time 时间
     * @return ResponseInfo
     */
    @ApiOperation("修改定时任务时间")
    @PutMapping("modify")
    public ResponseInfo modifyQuartzJob(String name, String group, String time){
        try {
            boolean modifyJob = quartzJobScheduler.modifyJob(name, group, time);
            if (modifyJob){
                return ResponseInfo.success();
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
            log.error("修改定时任务时间失败", e);
            return ResponseInfo.fail(e.getMessage());
        }
        return ResponseInfo.fail("[" + name + "]任务定时时间修改失败");
    }

    /**
     * 停止一个任务
     * @param name 名字
     * @param group 组
     * @return ResponseInfo
     */
    @ApiOperation("停止一个任务")
    @PostMapping("pause")
    public ResponseInfo pauseQuartzJob(String name, String group){
        try {
            boolean pauseJob = quartzJobScheduler.pauseJob(name, group);
            if (pauseJob){
                return ResponseInfo.success();
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
            log.error("停止一个任务失败", e);
            return ResponseInfo.fail(e.getMessage());
        }
        return ResponseInfo.fail("[" + name + "]任务停止失败");
    }

    /**
     * 停止所有的任务
     * @return ResponseInfo
     */
    @ApiOperation("停止所有的任务")
    @PostMapping("pauseAll")
    public ResponseInfo pauseAllJob(){
        try {
            quartzJobScheduler.pauseAllJob();
            return ResponseInfo.success();
        } catch (SchedulerException e) {
            e.printStackTrace();
            log.error("停止所有任务失败", e);
            return ResponseInfo.fail(e.getMessage());
        }
    }

    /**
     * 删除一个任务
     * @param name 名字
     * @param group 组
     * @return ResponseInfo
     */
    @ApiOperation("删除一个任务")
    @DeleteMapping("delete")
    public ResponseInfo deleteJob(String name, String group){
        try {
            boolean deleteJob = quartzJobScheduler.deleteJob(name, group);
            if (deleteJob){
                return ResponseInfo.success();
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
            log.error("删除一个任务失败", e);
            return ResponseInfo.fail(e.getMessage());
        }
        return ResponseInfo.fail("[" + name + "]任务删除失败");
    }

    /**
     * 唤醒一个任务
     * @param name 名字
     * @param group 组
     * @return ResponseInfo
     */
    @ApiOperation("唤醒一个任务")
    @PostMapping("resume")
    public ResponseInfo resume(String name, String group){
        try {
            boolean resumeJob = quartzJobScheduler.resumeJob(name, group);
            if (resumeJob){
                return ResponseInfo.success();
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
            log.error("唤醒一个任务失败", e);
            return ResponseInfo.fail(e.getMessage());
        }
        return ResponseInfo.fail("[" + name + "]任务唤醒失败");
    }

    /**
     * 唤醒所有任务
     * @return ResponseInfo
     */
    @ApiOperation("唤醒所有任务")
    @PostMapping("resumeAll")
    public ResponseInfo resumeAll(){
        try {
            quartzJobScheduler.resumeAllJob();
            return ResponseInfo.success();
        } catch (SchedulerException e) {
            e.printStackTrace();
            log.error("唤醒所有任务失败", e);
            return ResponseInfo.fail(e.getMessage());
        }
    }


}
